package com.arctic.coding.marvin.car;


import lejos.nxt.NXTRegulatedMotor;

public class EngineControl extends MotorControl {
	
	private final int DEFAULT_SPEED;
	
	private boolean engineStarted = false;
	
	
	/**
	 * Konstruktor mit Angabe des Verwendeten Motors und der Standardgeschwindigkeit
	 * 
	 * @param engine 	Der verwendete Motor
	 * @param speed		Die Standartgeschwindikeit des Motors
	 */
	public EngineControl(NXTRegulatedMotor engine, int speed) {
		
		super(engine);		
			
		if (speed < 0.0) {
			throw new RuntimeException("Die Geschwindikeit darf nicht negativ sein !");			
		}		
		
		this.DEFAULT_SPEED 	= speed;
		
	}
	
	/**
	 * Konstruktor mit Angabe des Verwendeten Motors, Standardgeschwindigkeit wird auf 360 gesetzt
	 * 
	 * @param engine 	Der verwendete Motor
	 */
	public EngineControl(NXTRegulatedMotor engine) {
		this(engine, 360);
	}	
	
	/**
	 * Setzt die Standardgeschwindigkeit und gibt die Motoren zur Benutzung frei
	 */
	public void startEngine() {
		super.getMotor().setSpeed(DEFAULT_SPEED);
		engineStarted = true;
	}
	
	/**
	 * Stoppt die Antriebsmotoren und sperrt sie bis sie wieder frei gegeben werden
	 */
	public void stopEngine() {
		super.getMotor().stop();
		engineStarted = false;
	}
	
	/**
	 * Veraendert die aktuelle Geschwindikeit des Motors auf den uebergebene Geschwindigkeit
	 * 
	 * @param speed Neue Geschwindigkeit, darf nicht kleiner als 0 sein
	 */
	public void changeSpeed(int speed) {	
		
		int newSpeed = (int) ((super.getMotor().getMaxSpeed() / 100) * speed);
		
		if (speed < 0) {
			throw new RuntimeException("Die Geschwindikeit darf nicht negativ sein !");			
		}		
		super.getMotor().setSpeed(newSpeed);
	}
	
	public void driveForward() {
		if (!engineStarted) {
			throw new RuntimeException("Der Motor ist nicht freigegeben !");
		}		
		super.getMotor().forward();
	}
	
	public void driveBackward() {
		if (!engineStarted) {
			throw new RuntimeException("Der Motor ist nicht freigegeben !");
		}	
		super.getMotor().backward();
	}
	
	public void stopDriving() {
		if (!super.getMotor().isMoving()) {
			throw new RuntimeException("Der Motor laeuft nicht !");
		}
		super.getMotor().stop();
	}
	
	public boolean isMoving() {
		return super.getMotor().isMoving();
	}
			
	
}
